package main

import (
	"fmt"
	"strings"
	"unicode"
)

var (
	name string
	age  int
	isok bool
)

func main() {
	fmt.Print("变量")
	name = "wujiangpan"
	fmt.Print(isok)
	fmt.Println("吴江攀")
	fmt.Printf("name:%s", name)

	//var xxx string = "wjp "
	var yyy = "wjp001"
	zzz := "wjp002" //只能在函数中使用
	//fmt.Println(xxx)
	fmt.Println(yyy)
	fmt.Println(zzz)
	//_匿名变量  不占用命名空间，不分配内存
	fmt.Print("常量")
	fmt.Print("iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义，在定义枚举时很有用。")
	// const (
	// 	n1 = iota //0
	// 	n2        //1
	// 	n3        //2
	// 	n4        //3
	// )
	// const (
	// 	n1 = iota //0
	// 	n2        //1
	// 	_
	// 	n4 //3
	// )
	const (
		n1 = iota //0
		n2 = 100  //100
		n3 = iota //2
		n4        //3
	)
	const n5 = iota //0
	fmt.Println(n1)
	fmt.Println(n2)
	//fmt.Println(n3)
	fmt.Println(n4)
	fmt.Println(n5)
	const (
		_  = iota
		KB = 1 << (10 * iota)
		MB = 1 << (10 * iota)
		GB = 1 << (10 * iota)
		TB = 1 << (10 * iota)
		PB = 1 << (10 * iota)
	)
	fmt.Println(KB)
	fmt.Println(MB)
	fmt.Println(GB)
	fmt.Println(TB)
	fmt.Println(PB)
	const (
		a, b = iota + 1, iota + 2 //1,2
		c, d                      //2,3
		e, f                      //3,4
	)
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
	fmt.Println(d)
	fmt.Println(e)
	fmt.Println(f)
	fmt.Println("整型")
	//十进制
	var i1 = 10
	fmt.Printf("%d\n", i1)
	fmt.Printf("%b\n", i1)
	fmt.Printf("%o\n", i1)
	fmt.Printf("%x\n", i1)
	//八进制
	i2 := 077
	fmt.Printf("%d\n", i2)
	//十六机制
	i3 := 0x123456
	fmt.Printf("%d\n", i3)
	//查看变量类型
	fmt.Printf("%T\n", i3)
	//声明int8类型
	i4 := int8(9)
	fmt.Printf("%T\n", i4)

	fmt.Println("浮点")
	//math.MaxFloat32  float32最大值
	f1 := 1.2345
	fmt.Printf("%T\n", f1) //默认float64
	f2 := float32(2.345)
	fmt.Printf("%T\n", f2)
	//  f1 =f2   float32不能直接复制float64
	fmt.Println("布尔")
	var b_2 bool
	b_1 := true
	fmt.Printf("%T\n", b_1)
	fmt.Printf("%T value:%v\n", b_2, b_2) //默认false 获取默认值
	fmt.Println("fmt总结")
	var n = 100
	fmt.Printf("%T\n", n)
	fmt.Printf("%v\n", n)
	fmt.Printf("%b\n", n)
	fmt.Printf("%d\n", n)
	fmt.Printf("%o\n", n)
	fmt.Printf("%x\n", n)
	var s = "吴江攀"
	fmt.Printf("字符串 %s\n", s)
	fmt.Printf("字符串 %v\n", s)
	fmt.Printf("字符串 %#v\n", s)
	fmt.Println("字符串是双引号包裹的！")
	fmt.Println("字符是单引号包裹的！！单独的字母汉字")
	//字符串转义
	path := "'E:\\gogo\\src\\studygo'"
	fmt.Println(path)
	//多行字符串
	s2 := `
			啊啊啊啊
			呃呃呃呃呃
			噢噢噢噢
	`
	fmt.Println(s2)
	s3 := `E:\gogo\src\studygo`
	fmt.Println(s3)

	fmt.Println(len(s3))
	name := "吴江攀"
	world := "dss"

	s4 := name + world

	fmt.Println(s4)
	s5 := fmt.Sprintf("%s%s", name, world)
	//fmt.Printf("%s%s", name, world)
	fmt.Println(s5)
	//分割
	ret := strings.Split(s3, "\\")
	fmt.Println(ret)
	//包含
	fmt.Println(strings.Contains(s3, "go"))
	//前缀
	fmt.Println(strings.HasPrefix(s3, "E"))
	//后缀
	fmt.Println(strings.HasSuffix(s3, "go"))
	//位置
	s6 := "abcdef"
	fmt.Println(strings.Index(s6, "a"))
	fmt.Println(strings.LastIndex(s6, "f"))
	//拼接
	fmt.Println(strings.Join(ret, "+"))

	fmt.Println("byte和rune")

	s7 := "hello吴江攀"
	n11 := len(s7)
	fmt.Println(n11)
	// for ii := 0; ii < len(s7); ii++ {
	// 	fmt.Println(s7[ii])
	// 	fmt.Printf("%c\n", s7[ii]) //字符
	// }
	for _, c := range s7 {
		fmt.Printf("%c\n", c)
	}
	fmt.Println("字符有以下byte和rune型") //字母汉字

	//字符串修改
	s8 := "张天爱"
	s9 := []rune(s8)
	s9[0] = '刘'
	fmt.Println(string(s9))

	s10 := "红"
	s11 := '红'
	fmt.Printf("c1:%T c2:%T\n", s10, s11)
	s12 := "H"
	s13 := 'H'
	fmt.Printf("c12:%T c13:%T\n", s12, s13)
	fmt.Printf("%d\n", s13)
	fmt.Printf("%d\n", s12)

	s14 := "hello吴江攀"
	count := 0
	for _, c1 := range s14 {
		if unicode.Is(unicode.Han, c1) {
			count++
		}
	}
	fmt.Printf("%d", count)
	fmt.Println("if语句for语句")
	if age := 18; age > 39 {
		fmt.Println("aaa")
	} else if age > 10 {
		fmt.Println("这种写法减少内存的占用")
	} else {
		fmt.Println("作用域只在if内")
	}

	for i := 1; i <= 9; i++ { // i 控制行，以及计算的最大值
		for j := 1; j <= i; j++ { // j 控制每行的计算个数
			fmt.Printf("%d*%d=%d ", j, i, j*i)
		}
		fmt.Println("")
	}
	//变种
	var s15 = 5
	for ; s15 < 10; s15++ {
		fmt.Println(s15)
	}
	// for{
	// 	fmt.Println("无限循环")
	// }
	var s16 = "hello中国留学生希望回国"

	for k, v := range s16 {
		fmt.Printf("k:%d v:%c\n", k, v)
	}

	for s17 := 0; s17 < 10; s17++ {
		if s17 == 5 {
			continue
		}
		fmt.Println(s17)
	}
	fmt.Println("a++单独的语句不能放在右边")
	fmt.Println("go强类型语言，只有相同类型的变量才能比较   关系运算符")
	fmt.Println("位运算符")
	//5    101
	//2     10
	fmt.Println(5 & 2)   //位与
	fmt.Println(5 | 2)   //位或
	fmt.Println(5 ^ 2)   //位异或
	fmt.Println(1 << 10) //左移
	fmt.Println(5 >> 1)  //右移
}
